//
//  main.swift
//  Lesson1Project
//
//  Created by 陈俊俊 on 15/7/7.
//  Copyright (c) 2015年 陈俊俊. All rights reserved.
//

import Foundation

//定义一个变量 就是一个值可以改变的 变量可以存储某个数据
var a = 10
a = 9
println(a)

//常量
let b = 10
println(b)

/*
类型标注
*/
var x: Int
x = 10
let y : Int = 10

//名称不用在符合类似于标识符的规范
let 常量 = 10
println("Hello, World!")

//变量
var name = "chenjunjun"
println("My name is \(name)")
//常量
let xiaochen = "xiaochen"
println("xiaochen's name is \(xiaochen)")
/*与其他大部分编程语言不同，
Swift 并不强制要求你在每条语句的结尾处使用分号（;）
，当然，你也可以按照你自己的习惯添加分号。
有一种情况下必须要用分号，
即你打算在同一行内写多条独立的语句：
*/
let xiaohuang = "xiaohuang"; println("His name is \(xiaohuang)");

/*
Swift中提供了8、16、32、64位的有符号和无符号整形数 例如 UInt8 Int8
在32位平台上，Int和Int32长度相同。
在64位平台上，Int和Int64长度相同。
在32位平台上，UInt和UInt32长度相同。
在64位平台上，UInt和UInt64长度相同。
*/
//访问不同整数类型的min和max属性来获取对应类型的最大值和最小值：
let minValue = UInt.min
let maxValue = UInt.max
println("minValue:\(minValue),maxValue:\(maxValue)")

let minValue8 = UInt8.min
let maxValue8 = UInt8.max
println("minValue8:\(minValue8),maxValue8:\(maxValue8)")

let minValue16 = UInt16.min
let maxValue16 = UInt16.max
println("minValue8:\(minValue16),maxValue8:\(maxValue16)")

let minValue32 = UInt32.min
let maxValue32 = UInt32.max
println("minValue8:\(minValue32),maxValue8:\(maxValue32)")

//浮点数
/*
Double表示64位浮点数，精度很高，至少有15位数字，
Float表示32位浮点数，至少6位数字
*/

/*
类型推断
*/
//会被推测为Int类型
let meaning  = 42
/*
会被推断成Double 当推测浮点数的类型时，
Swift 总是会选择Double而不是Float。
如果表达式中出现了整数和浮点数，会被推断成Double
*/
let num = 3.14159
let anotherNume = 3 + 0.14159

/*
进制的表示
十进制没有前缀
二进制前缀为0b
八进制前缀为0o
十六进制前缀为0x
*/

let decimalInteger = 17           //十进制的17
let binaryInteger = 0b10001       // 二进制的17
let octalInteger = 0o21           // 八进制的17
let hexadecimalInteger = 0x11     // 十六进制的17

//类型转化
let twoThousand: UInt16 = 2000
let one: UInt8 = 1
let twoThousandAnfOne = twoThousand + UInt16(one)
println("twoThousandAnfOne is \(twoThousandAnfOne)")

let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
//pi被推断成Double

let integerPi = Int(pi)
//结果是3

//类型的别名用typealiases
typealias AudioSample = UInt16
var maxNum = AudioSample.min
//结果是0 AudioSample就是UInt16的类别

//布尔值 有true和false
let trueValue = true
let falseValue = false
if trueValue{
    println("This is true")
}else{
    println("This is false")
}

let i = 1
//if i{
//这样回报一个编译错误
//}
if i == 1 {
    println("This is true")
}

//元组 是把多个值组合成一个复合值元组内的值可以使任意类型，并不要求是相同类型

let httpErrorStatus = (404,"Not Found","three")
let (statusCode , statusMessage , threeMessage) = httpErrorStatus
println("statusCode:\(statusCode),statusMessage:\(statusMessage)")

//如果只需要元组的一部分，只需要把忽略的部分用下划线(_)标记
let (justCode , _ , _) = httpErrorStatus
println("justCode:\(justCode)")

//可以通过下标来访问隐患组的单个元素，下标从零开始
println("justCodde0:\(httpErrorStatus.0)")
println("justCodde1:\(httpErrorStatus.1)")

//基本数据类型：整数类型,小数类型
//Int8/16/32/64
//UInt8/16/32/64
//Double/Float
let interger: Int = 10
let inte: Int8 = 10
let unsiginedInt: UInt32 = 19
//let overValue: UInt8 = UInt8.max + 1 溢出

// 可选 使用可选值来处理可能缺失的情况
let passibleNumber = "123"
//转化成int时，可能会失败，所以他返回一个可选的Int 而不是一个Int
let intNumber = passibleNumber.toInt()

if intNumber != nil {
    println("\(passibleNumber) has an integer value of \(intNumber!)")
}else {
    println("\(passibleNumber) could not be converted to an integer")
}
//可选帮定值
/*
“如果possibleNumber.toInt返回的可选Int包含一个值，创建一个叫做actualNumber的新常量并将可选包含的值赋给它。”
如果转换成功，actualNumber常量可以在if语句的第一个分支中使用。它已经被可选包含的值初始化过，所以不需要再使用!后缀来获取它的值。在这个例子中，actualNumber只被用来输出转换结果。
*/
if let actualNumber = passibleNumber.toInt(){
    println("\(passibleNumber) has an integer value of \(actualNumber)")
}else {
    println("\(passibleNumber) could not be converted to an integer")
}

var serverCode :Int? = 404
//serverCode 包含一个可选的 Int 值 404
serverCode = nil
//serverCode 现在不包含值

//可选类型的声明 
//声明一个可选常量或者变量但是没有赋值，它们会自动被设置为nil
//区别与oc：OC中nil指向不存在的
var surveyAnswer :String?










